package demo16

// interpreter

import (
	"strings"
	"strconv"
)
// 节点
type Node interface{
	Interpret() int
}
// 实例化节点
type ValNode struct{
	val int
}
// 默认节点
func (n *ValNode) Interpret() int{
	return n.val
}

// 节点增加
type AddNode struct{
	left,right Node
}
func (n *AddNode) Interpret() int {
	return n.left.Interpret() + n.right.Interpret()
}
// 节点相减
type MinNode struct{
	left,right Node
}

func (n *MinNode) Interpret() int {
	return n.left.Interpret() - n.right.Interpret()
}

// 转换
type Parser struct{
	exp []string  // 分割
	index int		// 索引
	prev Node		// 节点
}

func (p *Parser) Parser(exp string){
	// 分割
	p.exp = strings.Split(exp," ")
	for {
		if p.index >= len(p.exp){
			return
		}
		switch p.exp[p.index] {
		case "+":
			p.prev = p.newAddNode()
		case "-":
			p.prev = p.newMinNode()
		default:
			p.prev = p.newValNode()
		}
	}
}

// 嵌套构造方法
func (p *Parser) newAddNode() Node{
	p.index++
	return &AddNode{
		left:p.prev,
		right:p.newValNode(),
	}
}

func (p *Parser)newMinNode() Node{
	p.index++
	return &MinNode{
		left:p.prev,
		right:p.newValNode(),
	}
}

func (p *Parser)newValNode() Node{
	v, _ := strconv.Atoi(p.exp[p.index])
	p.index++
	return &ValNode{
		val:v,
	}
}

func (p *Parser)Result() Node{
	return p.prev
}